#ifndef _IMGALGORBASE_H_
#define _IMGALGORBASE_H_
#include "commonDefine.h"
#include <array>
#include <sys/time.h>


typedef struct {
    uint32_t            width;
    uint32_t            height;
    int                 pixel_format;
    uint32_t            stride[4];
    uint8_t*            virt_addr[4];

    uint32_t            time_ref;
    uint64_t            pts;

    uint8_t             user_data[64];
} ss_video_frame;


typedef struct DetectRect
{
	// 我们统一规定DetectRect中存储的为左顶点坐标。
	// point对应4边形的4个点，左上，右上，左下，右下。例如左上 x = point[0][0],y = point[0][1];
	int point[4][2];

	int x(){
		return point[0][0];
	}

	int y(){
		return point[0][1];
	}

	int w() {
		return point[1][0] - point[0][0];
	}

	int h() {
		return point[2][1] - point[0][1];
	}

	DetectRect(int tx,int ty,int tw,int th)
	{
		point[0][0] = tx;
		point[0][1] = ty;

		point[1][0] = tx + tw;
		point[0][1] = ty;

		point[2][0] = tx;
		point[2][1] = ty + th;

		point[3][0] = tx + tw;
		point[3][1] = ty + th;
	}
	DetectRect(){
		memset(point,0,sizeof(point));
	}
}DetectRect;

class AlgorithmBase {
public:
	//AlgorithmBase() {};
	virtual ~AlgorithmBase() {};

	// 只传入配置/资源文件路径，自行加载对应资源文件。按照绝对路径处理。
	virtual int  Algorithm_Init(const char* CfgPath) = 0;

	// 传入初始运行参数，例如目标跟踪框
	virtual int  Algorithm_RunCfg(DetectRect* rect ) = 0;
	// 重置运行相关参数。
	virtual int  Algorithm_Reset() = 0;


	// 输入图片并获取处理结果
	virtual int  Algorithm_DoProcess(ss_video_frame* frame, std::vector<DetectRect>* resultIN, std::vector<DetectRect>* resultOUT) = 0;

	// 算法库名称，版本号Ver.x.x
	virtual const char* Algorithm_Name() = 0;
	virtual const char* Algorithm_Version() = 0;   
};

// 函数运行计时
class TIMEUSE{
public:
    TIMEUSE(){gettimeofday(&st,nullptr);}
    ~TIMEUSE(){
        gettimeofday(&et,nullptr);
        INFO_PRT("TIMEUSE %ld us\n",(et.tv_sec -st.tv_sec)*1000*1000 + (et.tv_usec - st.tv_usec));
    }
private:
    
    struct timeval st,et;
};

#endif